ggplot2(11)-分面

纵向分面

分面可以将数据分割绘制到子图中,分布的时候,可以横向分面,也可以纵向分面,如下所示:

1
2
3
library(ggplot2)
p <- ggplot(mpg,aes(x=displ,y=hwy)) + geom_point()
p + facet_grid(drv~.) # 按照drv进行分面,纵向

mark

横向分面

1
p + facet_grid(.~cyl) # 根据cyl进行分面,横向

mark

矩阵分面

1
p + facet_grid(drv~cyl) # 根据drv与cyl进行分面

mark

从左到右分面

1
p + facet_wrap(~class) # 依次从左到右进行分面

mark

指定分面行数

1
p + facet_wrap(~class,nrow=2) # 分为两行

mark

指定分面列数

1
p + facet_wrap(~class,ncol=4) # 分为四列

mark

在不同的坐标轴下使用分面

使用y轴

1
2
p <- ggplot(mpg,aes(x=displ,y=hwy)) + geom_point()
p + facet_grid(drv~cyl,scales="free_y")

mark

使用x轴标度

1
p + facet_grid(drv~cyl,scales="free")

mark

当坐标轴的标度为free时,则每行的子图都有自己的y值域,前面的例子中,未设置free,则所有的分面使用的相同的y值域。

修改分面的文本标签

1
2
3
4
5
6
7
mpg2 <- mpg
levels(mpg2$drv)[levels(mpg2$drv)=="4"] <- "4wd"
levels(mpg2$drv)[levels(mpg2$drv)=="f"] <- "Front"
levels(mpg2$drv)[levels(mpg2$drv)=="r"] <- "Rear"
ggplot(mpg2,aes(x=displ,y=hwy)) + geom_point()+facet_grid(drv~.)

mark

进行分面时,可以同时将分面变量的名称与值输出,用到的函数是labelle=label_both,如下所示:

1
2
ggplot(mpg2,aes(x=displ,y=hwy)) + geom_point() +
facet_grid(drv~.,labeller = label_both)

mark

用labeller = label_parsed可以读入字符串:

1
2
3
4
5
6
7
mpg3 <- mpg
levels(mpg3$drv)[levels(mpg3$drv)=="4"] <- "4^{wd}"
levels(mpg3$drv)[levels(mpg3$drv)=="f"] <- "-Front %.%e^{pi*i}"
levels(mpg3$drv)[levels(mpg3$drv)=="r"] <- "4^{wd}-Front"
ggplot(mpg3,aes(x=displ,y=hwy)) + geom_point()+
facet_grid(drv ~.,labeller=label_parsed)

mark

修改分面标签和标题的外观

下面的代码对日期(.~Date)进行分面,将分面标签的字体加粗(face=“bold”),字体为基本字体的1.5倍(rel(1.5)),将分面标签的背景改为浅蓝色(fill=“lightblue”),边框改为黑色(colour=“black”)

1
2
3
4
5
6
7
8
9
library(gcookbook)
## Warning: package 'gcookbook' was built under R version 3.4.4
ggplot(cabbage_exp,aes(x=Cultivar,y=Weight)) + geom_bar(stat="identity") +
facet_grid(.~Date) +
theme(strip.text = element_text(face="bold",size=rel(1.5)),
strip.background = element_rect(fill="lightblue",colour="black",
size=1))

mark

参考资料

  1. 常肖楠, 邓一硕, 魏太云. R数据可视化手册[M]. 人民邮电出版社, 2014.